/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.aspas.beans;

import br.com.aspas.modelo.AtividadeInscricao;
import br.com.aspas.modelo.Caixa;
import br.com.aspas.modelo.ItensCaixa;
import br.com.aspas.modelo.Produto;
import br.com.aspas.modelo.Recebimentos;
import br.com.aspas.modelo.TipoInscricao;
import br.com.aspas.modelo.ValidadeInscricao;
import br.com.aspas.modelo.usuario.UsuarioEventoPerfil;
import br.com.aspas.persistencia.AtividadeInscricaoDao;
import br.com.aspas.persistencia.CaixaDao;
import br.com.aspas.persistencia.ItensCaixaDao;
import br.com.aspas.persistencia.ProdutoDao;
import br.com.aspas.persistencia.RecebimentosDao;
import br.com.aspas.persistencia.TipoInscricaoDao;
import br.com.aspas.persistencia.ValidadeInscricaoDao;
import br.com.aspas.util.Comprovante;
import br.com.printer.client.PrinterClient;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 *
 * @author Reinaldo Viana
 */
public class CaixaBean {

    private RecebimentosDao recebimentosDao;
    private Integer codigoProduto;
    private Integer codigoTipoInscricao;
    private Integer codigoCaixa;
    private Integer quantidade;
    private Double total;
    private Double valorRecebido;
    private Double valorTroco;
    private String formaPagamento;
    private Caixa caixa;
    private Produto produto;
    private ItensCaixa itensCaixa;
    private CaixaDao caixaDao;
    private ItensCaixaDao itensCaixaDao;
    private ProdutoDao produtoDao;
    private TipoInscricaoDao tipoInscricaoDao;
    private List<ItensCaixa> listItensCaixa;
    private List<SelectItem> listProduto;
    private List<SelectItem> listTipoInscricao;
    private List<SelectItem> atividades;
    private TipoInscricao tipoInscricao;
    private Double valorRecb;
    private Integer codigoTipoPessoa;
    private AtividadeInscricaoDao atividadeInscricaoDao;
    private ValidadeInscricaoDao validadeInscricaoDao;
    private Integer codigoAtividade;
    private AtividadeInscricao atividadeInscricao;
    private Double valorInscricao;
    private Comprovante comprovante;
    private ValidadeInscricao validadeInscricao;
    private Boolean reimpressao;
    private PrinterClient printerClient;
    private Caixa recibo;

    public CaixaBean() {
        reciboList = new ArrayList<Caixa>();
        recibo = new Caixa();
        orcamentoCaixa = new Caixa();
        reimpressao = false;
        validadeInscricao = new ValidadeInscricao();
        caixa = new Caixa();
        produto = new Produto();
        tipoInscricao = new TipoInscricao();
        caixaDao = new CaixaDao();
        itensCaixaDao = new ItensCaixaDao();
        tipoInscricaoDao = new TipoInscricaoDao();
        produtoDao = new ProdutoDao();
        listItensCaixa = new ArrayList<ItensCaixa>();
        atividadeInscricaoDao = new AtividadeInscricaoDao();
        validadeInscricaoDao = new ValidadeInscricaoDao();
        atividadeInscricao = new AtividadeInscricao();
        valorInscricao = null;
        total = 0.0;
        valorRecebido = 0.0;
        valorTroco = 0.0;
        quantidade = 0;
        recebimentosDao = new RecebimentosDao();
        //iniciaCaixa();
    }

    private void iniciaCaixa() {
        try {
            Login login = login = (Login) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("Login");
            UsuarioEventoPerfil usuarioEventoPerfil = login.getUsuarioEventoPerfil();
            printerClient = new PrinterClient(usuarioEventoPerfil.getUsuario().getIpCaixa());
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Caixa nao iniciado"));
        }
    }

    public Boolean getReimpressao() {
        return reimpressao;
    }

    public void setReimpressao(Boolean reimpressao) {
        this.reimpressao = reimpressao;
    }

    public Double getValorRecb() {
        return valorRecb;
    }

    public void setValorRecb(Double valorRecb) {
        this.valorRecb = valorRecb;
    }

    public Caixa getCaixa() {
        return caixa;
    }

    public void setCaixa(Caixa caixa) {
        this.caixa = caixa;
    }

    public ValidadeInscricao getValidadeInscricao() {
        return validadeInscricao;
    }

    public void setValidadeInscricao(ValidadeInscricao validadeInscricao) {
        this.validadeInscricao = validadeInscricao;
    }

    public ItensCaixa getItensCaixa() {
        return itensCaixa;
    }

    public void setItensCaixa(ItensCaixa itensCaixa) {
        this.itensCaixa = itensCaixa;
    }

    public Integer getCodigoProduto() {
        return codigoProduto;
    }

    public void setCodigoProduto(Integer codigoProduto) {
        this.codigoProduto = codigoProduto;
    }

    public Integer getCodigoCaixa() {
        return codigoCaixa;
    }

    public void setCodigoCaixa(Integer codigoCaixa) {
        this.codigoCaixa = codigoCaixa;
    }

    public Integer getCodigoAtividade() {
        return codigoAtividade;
    }

    public void setCodigoAtividade(Integer codigoAtividade) {
        this.codigoAtividade = codigoAtividade;
    }

    public AtividadeInscricao getAtividadeInscricao() {
        return atividadeInscricao;
    }

    public void setAtividadeInscricao(AtividadeInscricao atividadeInscricao) {
        this.atividadeInscricao = atividadeInscricao;
    }

    public List<SelectItem> getAtividades() {
        atividades = new ArrayList<SelectItem>();
        List<AtividadeInscricao> listAtividades = atividadeInscricaoDao.findAllAtividadeInscricao();
        for (Iterator it = listAtividades.iterator(); it.hasNext();) {
            AtividadeInscricao atividadeInscricao2 = (AtividadeInscricao) it.next();
            SelectItem item = new SelectItem();
            item.setLabel(atividadeInscricao2.getNome());
            item.setValue(atividadeInscricao2.getCodigo());
            atividades.add(item);
        }

        return atividades;
    }

    public void setAtividades(List<SelectItem> atividades) {
        this.atividades = atividades;
    }

    public List<SelectItem> getListTipoInscricao() {
        listTipoInscricao = new ArrayList<SelectItem>();
        List<TipoInscricao> lista = tipoInscricaoDao.findAllTipoInscricao();
        for (TipoInscricao tipoInsc : lista) {
            SelectItem item = new SelectItem();
            item.setLabel(tipoInsc.getNome());
            item.setValue(tipoInsc.getCodigo());
            listTipoInscricao.add(item);
        }
        return listTipoInscricao;
    }

    public void setListTipoInscricao(List<SelectItem> listTipoInscricao) {
        this.listTipoInscricao = listTipoInscricao;
    }

    public List<ItensCaixa> getListItensCaixa() {
        return listItensCaixa;
    }

    public void setListItensCaixa(List<ItensCaixa> listItensCaixa) {
        this.listItensCaixa = listItensCaixa;
    }

    public Integer getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }

    public Double getTotal() {
        return total;
    }

    public void setTotal(Double total) {
        this.total = total;
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public TipoInscricao getTipoInscricao() {
        return tipoInscricao;
    }

    public void setTipoInscricao(TipoInscricao tipoInscricao) {
        this.tipoInscricao = tipoInscricao;
    }

    public Double getValorRecebido() {
        return valorRecebido;
    }

    public void setValorRecebido(Double valorRecebido) {
        this.valorRecebido = valorRecebido;
    }

    public Double getValorTroco() {
        return valorTroco;
    }

    public void setValorTroco(Double valorTroco) {
        this.valorTroco = valorTroco;
    }

    public String getFormaPagamento() {
        return formaPagamento;
    }

    public void setFormaPagamento(String formaPagamento) {
        this.formaPagamento = formaPagamento;
    }

    public Integer getCodigoTipoInscricao() {
        return codigoTipoInscricao;
    }

    public void setCodigoTipoInscricao(Integer codigoTipoInscricao) {
        this.codigoTipoInscricao = codigoTipoInscricao;
    }

    public Double getValorInscricao() {
        return valorInscricao;
    }

    public void setValorInscricao(Double valorInscricao) {
        this.valorInscricao = valorInscricao;
    }

    public List<SelectItem> getListProduto() {
        listProduto = new ArrayList<SelectItem>();
        List<Produto> lista = produtoDao.findAllProduto();
        for (Produto produto2 : lista) {
            SelectItem item = new SelectItem();
            item.setLabel(produto2.getNome());
            item.setValue(produto2.getCodigo());
            listProduto.add(item);
        }
        return listProduto;
    }

    public Integer getCodigoTipoPessoa() {
        return codigoTipoPessoa;
    }

    public void setCodigoTipoPessoa(Integer codigoTipoPessoa) {
        this.codigoTipoPessoa = codigoTipoPessoa;
    }

    public void setListProduto(List<SelectItem> listProduto) {
        this.listProduto = listProduto;
    }

    public String addItem() {
        return null;
    }

    public String alteraValor() {
        total = validadeInscricao.getValor() * quantidade;
        caixa.setTotal(total);
        return null;
    }

    public String pesqValorAtividade() {
        validadeInscricao = validadeInscricaoDao.findValidade(new Date(), codigoAtividade);
        total = validadeInscricao.getValor() * quantidade;
        caixa.setTotal(total);

        return null;
    }

    public String gravarCaixa() {

        caixaDao.inserir(caixa);
        caixaDao.altera(caixa);
        return null;
    }

    public String pesquisarProduto() {
        total = 0.0;
        produto = produtoDao.findByPk(codigoAtividade);
        total = produto.getValor() * quantidade;
        setTotal(total);
        return null;
    }

    public String configuraValor() {
        validadeInscricao = validadeInscricaoDao.findValidade(new Date(), codigoAtividade);
        total = validadeInscricao.getValor() * quantidade;
        setTotal(total);
        return null;
    }

    public String configuraQuantidade() {
        if (validadeInscricao.getValor() == null | quantidade == null) {
            total = 0.0;
        } else {
            total = validadeInscricao.getValor() * quantidade;
        }

        System.out.println("TOTAL :" + total);
        setTotal(total);
        return null;
    }

    public String troco() {
        valorTroco = valorRecb - total;
        return null;
    }

    public String imprimirComprovante() {
//        Login login = new Login();
//        login = (Login) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("Login");
//        if (reimpressao) {
//            comprovante = new Comprovante(login.getUsuarioEventoPerfil().getEvento().getModeloRecibo());
//            printerClient.print(new StringBuilder(comprovante.gerarComprovante(caixa)));
//        }
//
//        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("CaixaBean");
        return "caixa";
    }

    public String fecharCaixa() {
        Login login = new Login();
        login = (Login) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("Login");
        if (valorRecb >= total) {
            atividadeInscricao.setCodigo(codigoAtividade);
            caixa.setAtividadeInscricao(atividadeInscricao);
            caixa.setTotal(total);
            caixa.setFormaPagamento(formaPagamento);
            caixa.setValorRecebido(valorRecb);
            caixa.setValorTroco(valorTroco);
            caixa.setQuantidade(quantidade);
            caixa.setTipoPessoa(codigoTipoPessoa);
            caixa.setEvento(login.getUsuarioEventoPerfil().getEvento());
            caixa.setDisponivel(quantidade);
            caixa.setStatus("FECHADO");
            caixaDao.inserir(caixa);
            comprovante = new Comprovante(login.getUsuarioEventoPerfil().getEvento().getModeloRecibo());

           // printerClient.print(new StringBuilder(comprovante.gerarComprovante(caixa)));

            FacesContext.getCurrentInstance().addMessage("form",
                    new FacesMessage("Compra efetuada com sucesso"));

        } else {
            FacesContext.getCurrentInstance().addMessage("form",
                    new FacesMessage("Compra não efetuada o valor recebido deve ser maior o valor total"));
        }
        return null;
    }

    public String financeiroInscricaoPrincipal() {
        return "financeiroInscricaoPrincipal";
    }

    public String caixaPrincipal() {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("CaixaBean");
        return "caixa";
    }

    private String tipoPesquisa;
    private String campoBusca;
    private String tipoPessoa;
    private List<Recebimentos> recebimentos;
    private Double totalSelecionado = 0d;
    private Recebimentos recebimentoTemporario;

    public String pesquisaFinanceiroInscricao() {
        Long cpfCnpj = null;
        Login login = new Login();
        login = (Login) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("Login");

        try {
            cpfCnpj = Long.parseLong(campoBusca);
            recebimentos = caixaDao.findRecebimentos(login.getUsuarioEventoPerfil().getEvento(), tipoPesquisa, campoBusca, tipoPessoa, campoBusca);
        } catch (NumberFormatException e) {
            recebimentos = caixaDao.findRecebimentos(login.getUsuarioEventoPerfil().getEvento(), tipoPesquisa, null, tipoPessoa, campoBusca);
        }
        totalSelecionado = 0d;
        return "financeiroInscricaoPrincipal";
    }

    public String contabilizar() {
        if (recebimentoTemporario.getSelected()) {
            totalSelecionado += recebimentoTemporario.getValor();
        } else {
            totalSelecionado -= recebimentoTemporario.getValor();
        }
        return null;
    }
    private Caixa orcamentoCaixa;

    public String mostraOrcamento() {

        orcamentoCaixa.setRecebimentos(new ArrayList<Recebimentos>());

        for (Recebimentos tmp : recebimentos) {
            if (tmp.getSelected() != null && tmp.getSelected()) {
                orcamentoCaixa.getRecebimentos().add(tmp);
            }
        }

        return "orcamento";
    }

    public String consultaRecibo() {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("CaixaBean");
        return "consultaRecibo";
    }

    public String calculaOrcamento() {
        if (orcamentoCaixa.getValorRecebido() < totalSelecionado) {
            FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage("O valor recebido é menor que o valor total. "
                    + "O pagamento será feito de forma parcial."));
            orcamentoCaixa.setValorTroco(0d);
        } else {
            orcamentoCaixa.setValorTroco(orcamentoCaixa.getValorRecebido() - totalSelecionado);
        }
        return null;
    }

    public String fecharOrcamento() {
        Login login = (Login) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("Login");
        orcamentoCaixa.setTotal(orcamentoCaixa.getValorRecebido());
        orcamentoCaixa.setDisponivel(0);
        caixaDao.inserir(orcamentoCaixa);
        orcamentoCaixa.setQuantidade(orcamentoCaixa.getRecebimentos().size());
        if (orcamentoCaixa.getValorRecebido() >= totalSelecionado) {
            for (Recebimentos tmp : orcamentoCaixa.getRecebimentos()) {
                tmp.setCaixa(orcamentoCaixa);
                tmp.setStatus("P");
                tmp.setTipoInscricao(tipoInscricaoDao.findByPk(1));
                tmp.setDataPagamento(orcamentoCaixa.getDataCaixa());
                recebimentosDao.altera(tmp);
            }
        } else {
            double valorRestante = orcamentoCaixa.getValorRecebido();
            int pivo = 0;

            while (valorRestante > 0) {
                Recebimentos tmp = orcamentoCaixa.getRecebimentos().get(pivo);

                if (valorRestante >= tmp.getValor()) {
                    tmp.setCaixa(orcamentoCaixa);
                    tmp.setStatus("P");
                    tmp.setDataPagamento(orcamentoCaixa.getDataCaixa());
                } else {
                    tmp.setCaixa(orcamentoCaixa);
                    tmp.setStatus("R");
                    tmp.setDataPagamento(orcamentoCaixa.getDataCaixa());
                    tmp.setValor(tmp.getValor() - valorRestante);
                }
                valorRestante -= tmp.getValor();
                pivo++;
                recebimentosDao.altera(tmp);
            }
        }
        comprovante = new Comprovante(login.getUsuarioEventoPerfil().getEvento().getModeloRecibo());
       // printerClient.print(new StringBuilder(comprovante.gerarComprovante(orcamentoCaixa)));
        caixa = orcamentoCaixa;
        FacesContext.getCurrentInstance().addMessage("msg1", new FacesMessage("Pagamento realizado."));

        return "financeiroInscricaoPrincipal";
    }
    private List<Caixa> reciboList;

    public String pesquisarRecibo() {
        Login login = (Login) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("Login");
        reciboList = new ArrayList<Caixa>();
        try {
            Integer codigoRecibo = Integer.parseInt(campoBusca);
            recibo = caixaDao.findByPk(codigoRecibo);
            reciboList.add(recibo);
        } catch (NumberFormatException ne) {
            reciboList = caixaDao.findRecibo(login.getUsuarioEventoPerfil().getEvento(), campoBusca, campoBusca);
        }

        return "";
    }

    public String verRecibo(){
        reimpressao = true;
        caixa = recibo;
        return "reciboDetalhe";
    }

    public List<Caixa> getReciboList() {
        return reciboList;
    }

    public void setReciboList(List<Caixa> reciboList) {
        this.reciboList = reciboList;
    }

    public Recebimentos getRecebimentoTemporario() {
        return recebimentoTemporario;
    }

    public void setRecebimentoTemporario(Recebimentos recebimentoTemporario) {
        this.recebimentoTemporario = recebimentoTemporario;
    }

    public Double getTotalSelecionado() {
        return totalSelecionado;
    }

    public void setTotalSelecionado(Double totalSelecionado) {
        this.totalSelecionado = totalSelecionado;
    }

    public String getCampoBusca() {
        return campoBusca;
    }

    public void setCampoBusca(String campoBusca) {
        this.campoBusca = campoBusca;
    }

    public String getTipoPesquisa() {
        return tipoPesquisa;
    }

    public void setTipoPesquisa(String tipoPesquisa) {
        this.tipoPesquisa = tipoPesquisa;
    }

    public String getTipoPessoa() {
        return tipoPessoa;
    }

    public void setTipoPessoa(String tipoPessoa) {
        this.tipoPessoa = tipoPessoa;
    }

    public List<Recebimentos> getRecebimentos() {
        return recebimentos;
    }

    public void setRecebimentos(List<Recebimentos> recebimentos) {
        this.recebimentos = recebimentos;
    }

    public Caixa getOrcamentoCaixa() {
        return orcamentoCaixa;
    }

    public void setOrcamentoCaixa(Caixa orcamentoCaixa) {
        this.orcamentoCaixa = orcamentoCaixa;
    }

    public Comprovante getComprovante() {
        return comprovante;
    }

    public void setComprovante(Comprovante comprovante) {
        this.comprovante = comprovante;
    }

    public Caixa getRecibo() {
        return recibo;
    }

    public void setRecibo(Caixa recibo) {
        this.recibo = recibo;
    }

    public String excluiRecibo(){
        if(recibo.getRecebimentos()==null || recibo.getRecebimentos().isEmpty()){
            recibo = caixaDao.findByPk(recibo.getCodigo());
            caixaDao.remove(recibo.getCodigo());
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("CaixaBean");
            FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Recibo removido"));
            return "consultaRecibo";
        }else {
            FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Não é possível excluir recibo vinculado a inscrições existentes"));
            return null;
        }
        
    }
}
